/*

 Robix com Infra-vermelho

 Controla 6 servos utilizando os comandos de um controle infravermelho.

 Componentes:
 * Arduino UNO
 * Controle Infravermelho NEC 21 teclas 38kHz
 * Receptor IR 38kHz
 * 1 led
 * 1 resistor 2200 ohms
 * 6 Servos

 Criado em: 05/08/2013 - Ville Medeiros - ville.medeiros@gmail.com
 Modificado em: 06/08/2013 - Ville Medeiros - ville.medeiros@gmail.com

 http://www.patrulhaeureka.org

 */
#include "EurekaRobix.h"

#include <EurekaIR.h>
#include <IRLib.h>
#include <EurekaIR_NEC21_38kHz.h>
#include <Servo.h>

EurekaIR controle;

int led = 13;

Servo servo00,servo01,servo02,servo03,servo04,servo05;
Servo servo[] = {servo00,servo01,servo02,servo03,servo04,servo05};
int pos[] = {90,90,90,90,90,90};
int Speed[] ={3,3,3,3,3,3};
int sAtual=0;
void initServos();
int servoAtual();
void ataque();
void reposicionaServos(int posicao[]);


void setup(){

	Serial.begin(9600);
    controle = EurekaIR(11);
    initServos();
    pinMode(led, OUTPUT);
    digitalWrite(led,LOW);
}

void loop(){

    long IRComando = controle.getComando();

    if (IRComando){
        switch(IRComando) {
            case NEGATIVO: pos[sAtual]=min(180,pos[sAtual]+Speed[sAtual]); break;
            case POSITIVO: pos[sAtual]=max(0,pos[sAtual]-Speed[sAtual]); break;
            case FORWARD:  Speed[sAtual]=min(10, Speed[sAtual]+1); break;
            case REV:      Speed[sAtual]=max(1, Speed[sAtual]-1); break;
            case BUTTON_0: pos[sAtual]=0*20; break;
            case BUTTON_1: pos[sAtual]=1*20; break;
            case BUTTON_2: pos[sAtual]=2*20; break;
            case BUTTON_3: pos[sAtual]=3*20; break;
            case BUTTON_4: pos[sAtual]=4*20; break;
            case BUTTON_5: pos[sAtual]=5*20; break;
            case BUTTON_6: pos[sAtual]=6*20; break;
            case BUTTON_7: pos[sAtual]=7*20; break;
            case BUTTON_8: pos[sAtual]=8*20; break;
            case BUTTON_9: pos[sAtual]=9*20; break;
            case MODE:     sAtual=servoAtual(); break;
            case ONOFF:    initServos(); break;
            case MUTE:	   ataque(); break;
        }

        servo[sAtual].write(pos[sAtual]);

        Serial.print("Servo [");
        Serial.print(sAtual);
        Serial.print("] pos = ");
        Serial.print(pos[sAtual]);
        Serial.print(" speed = ");
        Serial.println(Speed[sAtual]);

    }
}

void initServos(){
	int p[]={0,96,180,180,180,0};
    reposicionaServos(p);
}

void ataque(){
	int p[]={60,96,60,0,90,50};
	reposicionaServos(p);
}

void reposicionaServos(int posicao[]){
	for (int i=0; i<=5; i++){
		pos[i]=posicao[i];
		servo[i].attach(i+5);
        servo[i].write(posicao[i]);
    }
}

int servoAtual(){
    int result = 0;

    Serial.print("Informe no Servo ATUAL [");
    Serial.print(result);
    Serial.println("] : ");

    digitalWrite(led,HIGH);

    result = controle.getComandoEspera();

    digitalWrite(led,LOW);

    if (result){
        switch(result) {
            case BUTTON_0: result = 0; break;
            case BUTTON_1: result = 1; break;
            case BUTTON_2: result = 2; break;
            case BUTTON_3: result = 3; break;
            case BUTTON_4: result = 4; break;
            case BUTTON_5: result = 5; break;
        }
        return result;
    }
    return sAtual;
}
